/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package LogicaNegocio.Biblioteca;

import AccesoDatos.Persistencia.Manager.ManagerMulta;
import AccesoDatos.Persistencia.Manager.ManagerOrden;
import MainBiblioSoft.BiblioSoft;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.NoResultException;
import javax.persistence.Query;

/**
 * Esta clase en java se encarga de cargar las asignacion de
 * multas a los usuarios que no han hecho la devolucion del
 * los ejemplares antes de la fecha establecida.
 *
 * @author sebaxtian
 * Archivo: CargarAsignacionMultas.java
 * @version 1.0
 * Fecha: dom jun  6 23:12:51 COT 2010
 */


public class CargarAsignacionMultas implements Runnable {

    //Atributos de clase
    private EntityManagerFactory managerFactory;
    private EntityManager entityManager;
    private ManagerOrden gestorOrden;
    private ManagerMulta gestorMulta;
    private List<Orden> ordenesVencidas;


    public CargarAsignacionMultas() {
        managerFactory = BiblioSoft.managerFactory;
        entityManager = managerFactory.createEntityManager();
        gestorOrden = new ManagerOrden();
        gestorMulta = new ManagerMulta();
        ordenesVencidas = new ArrayList<Orden>();
    }

    private void cargarOrdenesVencidas() {
        entityManager.clear();
        Orden orden;
        int idOrden = -1;
        //SELECT O.IDORDEN FROM ORDEN O, PRESTAMO P WHERE O.IDORDEN = P.IDORDEN AND P.DEVUELTO = FALSE AND P.FECHAENTREGA < '2010-06-07';
        Query consulta = entityManager.createQuery("SELECT o.idorden FROM EOrden o, EPrestamo p WHERE o.idorden = p.idorden AND p.devuelto = FALSE AND p.fechaentrega < CURRENT_DATE");
        Iterator iterador = consulta.getResultList().iterator();
        while(iterador.hasNext()){
            idOrden = (Integer)iterador.next();
            orden = gestorOrden.obtenerOrden(idOrden);
            ordenesVencidas.add(orden);
        }
        entityManager.clear();
    }

    private void asignarMultasDiarias() {
        Multa multa;
        Calendar ultimaFechaAsignacion = obtenerUltimaFechaDeAsignacion();
        Calendar fechaActual = Calendar.getInstance();
        Calendar fechaOrden = Calendar.getInstance();
        if(ultimaFechaAsignacion == null || ultimaFechaAsignacion.get(Calendar.DAY_OF_YEAR) < fechaActual.get(Calendar.DAY_OF_YEAR)){
            for(int i = 0; i < ordenesVencidas.size(); i++){
                Orden orden = ordenesVencidas.get(i);
                fechaOrden.setTime(orden.getFecha());
                if(ultimaFechaAsignacion != null){
                    for(int j = ultimaFechaAsignacion.get(Calendar.DAY_OF_YEAR); j < fechaActual.get(Calendar.DAY_OF_YEAR); j++){
                        multa = new Multa();
                        multa.setCancelada(false);
                        multa.setFecha(fechaActual.getTime());
                        multa.setIdentificacionUsuario(orden.getIdentificacionUsuario());
                        multa.setValor(1000);
                        gestorMulta.crearMulta(multa);
                    }
                }else{
                    for(int j = fechaOrden.get(Calendar.DAY_OF_YEAR); j < fechaActual.get(Calendar.DAY_OF_YEAR); j++){
                        multa = new Multa();
                        multa.setCancelada(false);
                        multa.setFecha(fechaActual.getTime());
                        multa.setIdentificacionUsuario(orden.getIdentificacionUsuario());
                        multa.setValor(1000);
                        gestorMulta.crearMulta(multa);
                    }
                }
            }
        }
    }

    private Calendar obtenerUltimaFechaDeAsignacion() {
        entityManager.clear();
        Date fechaAsignacion = null;
        Calendar calendario = null;
        Query consulta = entityManager.createQuery("SELECT e.fechamulta FROM EMulta e WHERE e.idmulta = (SELECT MAX(m.idmulta) FROM EMulta m)");
        try{
            fechaAsignacion = (Date)consulta.getSingleResult();
            calendario = Calendar.getInstance();
            calendario.setTime(fechaAsignacion);
        }catch(NoResultException exc){}
        entityManager.clear();
        return calendario;
    }

    public void run() {
        cargarOrdenesVencidas();
        asignarMultasDiarias();
    }

}
